#ifndef TASK_CONTROLLER_H
#define TASK_CONTROLLER_H

#include "../global.h"
#include "task_chain.h"
#include "exclude/exclude_policy.h"

namespace task
{
/**
 * @brief:  任务控制器，内部包含多组任务链
 * @author: sherlock_lht
 */
class TaskControllerData;
class TaskController
{
public:
    explicit TaskController();
    ~TaskController();

    /**
     * @brief:  设置最大并行任务数量
     * @author: sherlock_lht
     */
    void setMaxParallelTaskCount(int32_t count);
    int32_t getMaxParallelTaskCount() const;

    /**
     * @brief:  添加需要互斥策略，开始任务时，互斥策略会按照顺序，依次执行
     * @note:   如果策略执行失败，则任务动作会被阻止
     * @author: sherlock_lht
     */
    void appendStartExcludePolicy(const exclude::ExcludePolicyConstPtr &policy);

    /**
     * @brief:  添加暂停排除策略，任务暂停前，互斥策略会按照顺序，依次执行
     * @note:   如果策略执行失败，则任务动作会被阻止
     * @author: sherlock_lht
     */
    void appendPauseExcludePolicy(const exclude::ExcludePolicyConstPtr &policy);

    /**
     * @brief:  添加恢复排除策略，任务恢复前，互斥策略会按照顺序，依次执行
     * @note:   如果策略执行失败，则任务动作会被阻止
     * @author: sherlock_lht
     */
    void appendResumeExcludePolicy(const exclude::ExcludePolicyConstPtr &policy);

    /**
     * @brief:  添加取消排除策略，任务取消前，互斥策略会按照顺序，依次执行
     * @note:   和其他策略不同的是，策略执行失败，不会阻止任务链继续
     * @author: sherlock_lht
     */
    void appendCancelExcludePolicy(const exclude::ExcludePolicyConstPtr &policy);

    /**
     * @brief:  添加结束排除策略，任务结束(主动取消和自主结束)，释放资源前会按照顺序，依次执行
     * @note:   如果任务未能正常开始，则不会执行
     * @author: sherlock_lht
     */
    void appendDoneExcludePolicy(const exclude::ExcludePolicyConstPtr &policy);

    /**
     * @brief:  获取当前正在执行的任务链
     * @note:   这里要注意，获取得是任务链的指针，使用时需要注意指针是否已经被删除
     * @author: sherlock_lht
     */
    std::vector<TaskChain *> getCurrentTaskChain() const;

    /**
     * @brief:  获取当前正在执行得所有任务链名称
     * @author: sherlock_lht
     */
    std::vector<std::string> getCurrentTaskChainName() const;

    /**
     * @brief:  立即开始执行一个任务链
     * @author: sherlock_lht
     */
    bool startTaskChain(TaskChain *task_chain);

    /**
     * @brief:  取消一个正在执行/尚未执行的任务链
     * @author: sherlock_lht
     */
    bool cancelTaskChain(const std::string &task_chain_name);

    /**
     * @brief:  暂停一个正在执行/尚未执行的任务链
     * @author: sherlock_lht
     */
    bool pauseTaskChain(const std::string &task_chain_name);

    /**
     * @brief:  恢复一个暂停的任务链
     * @author: sherlock_lht
     */
    bool resumeTaskChain(const std::string &task_chain_name);

    /**
     * @brief:  获取指定名称的任务链当前的状态
     * @author: sherlock_lht
     */
    task::TaskChainStatus getTaskChainStatue(const std::string &task_chain_name);

    /**
     * @brief:  根据task chain名称获取task chain
     * @note:   使用时注意，获取task chain如果开启自动删除，则可能出现使用时变成null的情况，从而导致程序崩溃
     * @author: kenan
     */
    task::TaskChain *getTaskChain(const std::string &task_chain_name);

private:
    DECLARE_DATA(TaskController)
};

}

#endif //TASK_CONTROLLER_H
